package com.lizardmind.haofudoctor.other

import android.os.Parcel
import android.os.Parcelable
import android.support.annotation.DrawableRes
import android.widget.Toast
import com.bigkoo.pickerview.model.IPickerViewData
import com.blankj.utilcode.util.TimeUtils
import com.blankj.utilcode.util.Utils
import com.linxiao.framework.BaseApplication
import com.linxiao.framework.activity.BaseActivity
import com.linxiao.framework.util.color
import com.linxiao.framework.util.toasts
import com.lizardmind.haofudoctor.AppApplication
import com.lizardmind.haofudoctor.R
import java.io.Serializable

/**
 * 各种实体类
 * Created by Administrator on 2017/10/16.
 */

/**
 * 网络数据统一包装类
 */
data class Request<T>(
        var time:Long,//返回时间，十三位的时间戳
        var error:String?,//错误提示，只有当status为0时有该值
        var action:String,//返回数据的接口名
        var status:Int,//状态码 0代表失败 1代表成功
        var data:T?//当status为1时有该值，该值是返回的数据，可能是数组也可能是对象
){
    /**
     * 判断是否成功
     * 如果状态为1，但是data==null也认定为失败
     */
    fun isSucceed():Boolean = status==1&&data!=null

    /**
     * 返回数据统一处理
     * @param err 当status=0时触发,默认显示error的toast
     * @param notData 当status=1 && data==null时触发
     * @param data 当status=1 && data!=null时触发
     */
    @Deprecated("已过期，请使用dispose方法",ReplaceWith(""))
    fun process(err:()->Unit={
                    Toast.makeText(Utils.getApp().applicationContext,error,Toast.LENGTH_SHORT).show()
                },
                notData:()->Unit={},
                data:(data:T)->Unit={}
                ){
        if(status==0){
            err()
        }else if(status == 1){
            if (this.data != null){
                data(this.data!!)
            }else{
                notData()
            }
        }
    }

    /**
     * @see `https://www.showdoc.cc/familydoctor?page_id=15476030`
     */
    fun dispose(err:()->Unit={ toasts(error.toString())},
                notErr:()->Unit={ toasts("code:"+status)},
                notData:()->Unit={ toasts("没有数据了")},
                data:(data:T)->Unit={}
    ){
        when(status){
            //保留字段
            in 100..199->{}
            //请求成功
            in 200..299->{
                if(status==200){
                    data(this.data!!)
                }else if(status==201){
                    notData()
                }
            }
            //请求失败（不给用户看，不用返回data和error就可以）
            in 300..399->{
                notErr()
            }
            //	请求失败（给用户看的，必须返回error，错误信息写在error里面）
            in 400..499->{
                err()
                if(status==400){
                    logOut()
                }
            }
        }
    }
}

private fun getAgeFromBirthday(b:String):Int{
    val now = TimeUtils.getNowString()
    val ns = now.split("-")
    val bs = b.split("-")
    return ns[0].toInt()-bs[0].toInt()+(if (ns[1].toInt()>=bs[1].toInt()) 0 else -1)
}

/**
 * 工作室
 */
data class StudioBean(val name: String,//名字
                      @DrawableRes val img: Int,//图片资源
                      val c:Class<out BaseActivity>//应该跳转的界面
)

/**
 * 医生实体类
 */
data class DoctorBean(
        val did:String,//id
        val name:String,//名称
        val phone:String,//手机号
        val head_img:String,//头像
        val sex:Int,//性别 1男2女
        val cause:String,//从事
        val type:String,//医生类别
        val aera:String,//地址
        val hospital_name:String,//医院名称
        val token:String,//身份令牌
        val birthday:String,//出生日期
        val rToken:String,//融云token
        var gonggao:String,//公告
        var good_at:String,//擅长
        var introduction:String//简介
):Serializable{
    val age:String //年龄
        get() = getAgeFromBirthday(birthday).toString()
}

//诊疗服务
data class DiagnosisBean(val imgUrl:String,
                         val name:String,
                         val content:String,
                         val time:String
)

data class HospitalBean(val id:String,//医院id
                        val name: String,//医院名称
                        val address:String,//医院地址
                        val level:String,//医院等级
                        val nature:String,//医院性质
                        val phone: String,//医院联系电话
                        val description:String//医院描述
)

//病历bean
data class MedicalHistoryBean(
        val itemFlag:Int=1,//单据标识,1:问诊单，2：随访复诊，3：方案
        val id:String ="",//id
        val sickManName:String,//患者姓名
        val sex:String,//性别
        val birthday:String,//生日
        val writeTime:String,//填写时间
        val sickManSaid:String="",//患者主诉
        val bodyFeel:String="",//身体感觉
        val isOk:String="",//已改善
        val notOk:String="",//未改善
        val newSymptom:String="",//新增症状
        val sickName:String="",//病症名
        val collectFee:String="",//方案补充收费
        val chuFang:String="",//处方
        val postNum:String="",//帖数
        val create_time: String=""//创建时间
){
    val age:String //年龄
        get() = getAgeFromBirthday(birthday).toString()
    val sickManData:String//病人基本信息
        get() = sickManName+"，"+(if (sex=="1") "男" else "女")+"，"+age+"岁"
}

//我的发布
data class MyPublishBean(val title:String,//发布名
                         val content: String,//内容
                         val create_time: String,//时间
                         val view: String,//浏览数
                         val id: String,//发布id
                         val did: String//医生id
)

//我的收藏
data class MyCollectBean(val id:String,//收藏id
                     val create_time:String,//创建时间
                     val art_id:String,//收藏内容的id
                     val title:String,//标题
                     val content: String,//内容
                     val user_data:user_dataBean//
)
data class user_dataBean(val head_img:String,//图片url
                     val name: String,//姓名
                     val cause: String//职称
)


/**
 * 问诊单实体类
 */
data class DiagnoseDocumentsBean(
        val id: String,//id
        val documents_status: Int,//问诊单状态：0->未填写，1->已填写
        val answer: Array<IntArray>,//答案
        val did: String,//医生id
        val send_time: Int,//医生发送给用户填写的时间
        val complete_time: Int,//填写时间
        val describe: String,//病症描述
        val tongue_picture: Array<String>,//舌苔照片
        val related_picture: Array<String>,//相关的检查报告或化验单
        val documents: BaseDocumentsBean,//基类问诊单
        val answer_details: Array<AnswerDetailsBean>,//答案详情
        val user_info: UserBean,//接表人的用户信息
        val candidate_info: Array<UserBean>,//候选填表人
        val fill_user: UserBean,//填表人的用户信息
        val note:String,//医生的备注
        val is_prescribing:Int//是否已开方，0：未开方，1：开方
):Serializable

/**
 * 基类问诊单
 */
data class BaseDocumentsBean(
        val id: String,//id
        val source:Int,//创建来源，0->系统创建，1->医生创建
        val title:String,//问诊单名称
        val problem:Array<TypeDocumentsBean>//问诊单的问题
):Serializable

/**
 * 问题的分类
 */
data class TypeDocumentsBean(
        val type_title: String,//分类问题的标题
        val data:Array<ProblemDocumentsBean>//具体的问题
):Serializable

/**
 * 问题实体类
 */
data class ProblemDocumentsBean(
        val type:Int,//问题类型：1->单选，2->多选
        val problem_title:String,//问题标题
        val options:Array<String>//问题选项
):Serializable

/**
 * 答案详情类
 */
data class AnswerDetailsBean(
        val type_title:String,//分类标题
        val type_answer:String//分类答案集合
):Serializable

/**
 * 用户实体类
 */
data class UserBean(
        val uid: String,//用户id
        val name:String,//用户名称
        val phone:String,//用户手机号
        val head_img:String,//头像
        val sex:Int,//性别1男2女
        val aera:String,//地址
        val token:String,//令牌
        val birthday:String,//生日，eg：1984-06-13
        val height:String,//身高(cm)
        val weight:String,//体重(kg)
        val bmi:String,//BMI
        val family_history:String,//家族史
        val disease_history:String,//疾病史
        val surgery_history:String,//手术史
        val medication_history:String,//用药史
        val allergy_history:String//过敏史
):Serializable{
    val age:String //年龄
        get() = getAgeFromBirthday(birthday).toString()

    fun getTitle():String = name+" "+(if(sex==1) "男" else "女")+" "+age+"岁"
}

/**
 * 发送复诊单实体类
 */
data class SendVisitBean(
        val id: String,//开方id
        val father_type:Int,//父亲类型，0：无，1：问诊单，2：复诊单
        val father_id:String,//父亲id
        val name: String,//患者名字
        val create_time: Int,//开方创建时间
        val describe: String,//病情主诉/用户反馈
        val note: String,//医生备注
        val birthday:String,//生日
        val sex: Int//性别
):Serializable{
    val age:String //年龄
        get() = getAgeFromBirthday(birthday).toString()
    fun getTitle():String = name+" "+(if(sex==1) "男" else "女")+" "+age+"岁"
}

/**
 * 开方实体类
 */
data class PrescribingBean(
        val id: String,
        val symptoms:String,//病症名
        val prescription:String,//处方
        val dosage:String,//剂型
        val number:String,//帖数
        val fufa:String,//服法
        val fu_time:String,//服药时间
        val avoid:String,//忌口与禁忌
        val way:String,//辩证思路
        val create_time:Int,//创建时间
        val title:String,//处方名字
        val sex:Int,//性别
        val supplement_fee:Int,//方案补充收费
        val custom_time:Int,//自定义时间
        val user_data:UserBean//实际被开方人
):Serializable

//处方bean
data class CustomChuFangMedicalBean(
//        val chuFangName:String,//处方名
        val medicalName: String,//药材名
        var medicalWeight: String//药材重量
)

/**
 * 药材选择bean，用于对接接口
 */
data class ChooseMedicineBeanApi(
        val version: String,//版本号
        val data: ArrayList<MedicineDataBean>//药材list
):Serializable
data class MedicineDataBean(
        val id:String,//药材对应id
        val title:String//药材名
):Serializable
//药材选择bean，自行使用
data class ChooseMedicineBean(
        val tag: String,//药材名首拼音标识
        val listMedicine: ArrayList<MedicineDataBean>//药材list
):Serializable

/**
 * 复诊单实体类
 */
data class VisitBean(
        val id: String,
        val doctor: DoctorBean,//医生实体类
        val user_info: UserBean,//
        val fill_user: UserBean,//填写用户实体类
        val prescribing:PrescribingBean,//开方实体类
        val evaluation_status:Int,//评价状态，0：未评价，1：已评价
        val evaluation:EvaluationBean,//评价实体类
        val body_feel:String,//病情变化
        val improved:String,//已改善方面
        val improved_not:String,//未改善方面
        val new_symptoms:String,//新增症状
        val tongue_picture: Array<String>,//舌苔照片
        val note: String,//备注（仅医生可见）
        val documents_status: Int,//复诊单状态，0：未填写，1：已填写
        val send_time: Int,//发送时间
        val complete_time: Int,//填写时间
        val is_prescribing:Int//是否已开方，0：未开方，1：开方
):Serializable{
    fun getDefaultString(s:String)=if(s.isEmpty()) "未填写" else s
    fun getDescribe():String{
        var i = 1
        var s = ""
        if(improved!=null && improved.isNotEmpty()){
            s+=i.toString()+". "+improved
            i++
        }
        if(improved_not!=null && improved_not.isNotEmpty()){
            s+=i.toString()+". "+improved_not
            i++
        }
        if(new_symptoms!=null && new_symptoms.isNotEmpty()){
            s+=i.toString()+". "+new_symptoms
        }
        return getDefaultString(s)
    }
}

/**
 * 评价实体类
 */
data class EvaluationBean(
        val id: String,
        val doctor:DoctorBean,//被评价的医生
        val user: UserBean,//评论人
        val experience:String,//评论详细体验
        val simple_experience:Int,//简单体验
        val complete_time:Int//填写时间
):Serializable

/**
 * 问诊单管理实体类
 */
data class DiagnoseManageBean(
        val price:String,//价格，医生设置的问诊价格
        val list:List<BaseDocumentsBean>,//各种基类问诊单
        val send:String,//发送出去的问诊单
        val receive:String//接收到的问诊单
)

/**
 * Serializable包装类
 */
data class SerializableBean(
        val ser:Serializable
):Serializable

/**
 * 处方bean
 */
data class ChuFangBean(
        val id:String,
        val did:String,//医生id
        val content:String,//处方内容
        val create_time:String,//创建时间
        val title:String//处方名
): Serializable

data class TextOnlyBean(
        val str:String
)

/**
 * 服务设置实体类
 */
data class ServiceSettingBean(
        val id: String,
        val welcome:String,//	欢迎语
        val charge:String,//	收费设置
        val disturb:Int,//是否咨询
        val time:String,//	开始时间，结束时间
        val week:String,//工作时间
        val supplement:String//补充收费说明
)


/**
 * 融云使用的userbean
 */
data class RongCloudUserBean(
        val name: String,
        val head_img: String
)

/**
 * 门诊信息bean
 */
data class MenZhenDataBean(
        val id:String,
        val hospital:String,//医院
        val address:String,//地址
        val way:String,//预约联系方式
        val did:String,//
        val service_time:String,//门诊时间
        val create_time:String
)

/**
 * 门诊信息当中，医生门诊时间bean
 */
data class MenZhenTimeBean(
        val week: String,
        var am: String,//上午 0不出诊1出诊
        var pm:String,//下午
        var night:String//晚上
)

/**
 * 省市bean
 */
data class ProvinceBean(
        val name:String,// name : 省份
        val city:ArrayList<CityBean>// city : [{"name":"北京市","area":["东城区","西城区","崇文区","宣武区","朝阳区"]}]
):IPickerViewData{

// 实现 IPickerViewData 接口，
// 这个用来显示在PickerView上面的字符串，
// PickerView会通过IPickerViewData获取getPickerViewText方法显示出来。
    override fun getPickerViewText(): String {
        return name
    }

}

data class CityBean(
        val name: String,//城市
        val area: ArrayList<String>//area : ["东城区","西城区","崇文区","昌平区"]
)
/**=======
 * 患者实体类
 */
data class PatientBean(
     val id: String,//患者id
     val new_time:Int,//最近聊天时间
     val create_time: Int,//创建时间
     val user_data:UserBean//用户数据
)

/**
 * 我的患教库bean
 */
data class MySickEducationBean(
        val id:String,
        val title:String,//标题
        val content:String,//简介内容
        val create_time:String
)

data class SystemEduBean(
        val id: String,
        val title: String,//标题
        val description:String,//简介
        val img: String,//图片url
        val url:String//文章url
)

/**
 * DiyVisitTime 自定义的头部
 * lg：日
 * lg：一
 */
data class DvtHeadBean(
        val name: String
)

/**
 * DiyVisitTime 自定义的月份显示
 * lg：2017年12月
 */
data class DvtDateBean(
        val date:String
)

/**
 * DiyVisitTime 自定义的日期显示
 */
data class DvtDayBean(
        val day:String,
        val date:Long,
        val isClick:Boolean=false,
        var isSelect:Boolean = false
){
    fun isToday() = day == "今天"
    fun getColor():Int{
        if (!isClick){
            if(isToday()){
                return BaseApplication.getAppContext().color(R.color.stress)
            }
            return BaseApplication.getAppContext().color(R.color.gray1)
        }else{
            if(isSelect){
                return BaseApplication.getAppContext().color(R.color.white)
            }
            return BaseApplication.getAppContext().color(R.color.gray3)
        }
    }
}

//data class FangAnBean(
//        val sickName:String,//病症名
//        val did:String,//医生id
//        val dImg:String,//医生头像
//        val dName:String,//医生名字
//        val sickManName:String,//病人名字
//)

/**
 * 签约家庭bean
 */
data class SignFamilyBean(
        val id:String,
        val head_img: String,//头像地址
        val name: String,//户主名字
        val sex:Int,
        val address: String,//家庭地址
        val number: Int,//家人数量
        val tag:String,//家庭成员身份标识
        val birthday: String
){
    val age:String
        get()=getAgeFromBirthday(birthday).toString()
}

/**
 * 医生给用户添加的名字备注bean
 */
data class BeiZhuBean(
        val id: String,
        val did: String,
        val uid: String,
        val name: String
)